
/**
 * 
 * 简单的自动曝光
 * 
 * 题目描述

一个图像有 n 个像素点，存储在一个长度为 n 的数组 img 里，每个像素点的取值范围 [0,255] 的正整数。

请你给图像每个像素点值加上一个整数 k（可以是负数），得到新图 newImg，使得新图 newImg 的所有像素平均值最接近中位值128。

请输出这个整数 k。

输入描述
n 个整数，中间用空格分开

输出描述
一个整数 k

备注
• 1 ≤ n ≤ 100
• 如有多个整数 k 都满足，输出小的那个 k
• 新图的像素值会自动截取到 [0,255] 范围。当新像素值 < 0，其值会更改为 0，当新像素值 > 255，其值会更改为 255。例如 newImg = "-1 -2 256"，会自动更改为 "0 0 255"

用例
输入	0 0 0 0
输出	128
说明	四个像素值都为0
输入	129 130 129 130
输出	-2
说明	-1的均值128.5，-2的均值为127.5，输出较小的数-2

 */

import java.util.Arrays;
import java.util.Scanner;

/**
  
 * 题目解析
本题如果用暴力法求解的话思路如下：

首先输入的老图片的像素值，应该是符合要求的，即像素点应都在[0,255]范围内，因此像素点最小值为0，最大值为255。那么：

如果我们想让 0 接近中位值 128，则需要加上 128。
如果我们想让 255 接近中位值 128，则需要减去 127。
因此，k 的取值范围应该在-127到128之间，这样的话，就可以保证每一个点都能接近到中位值。

那么 k 从-127遍历到128，然后将遍历 k 加到老图片的每一个像素值上，然后求平均值avg。

需要注意的是，如果新图片的像素点值低于0，则取0，高于255，则取255
我们只需要保留最接近128的avg的最小 k 即可。

  */
public class 简单的自动曝光 {
    
    public static void main(String[] args) {
        
        try{

            Scanner scanner = new Scanner(System.in);

            int[] originImgArr = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

            //K 的取值范围  -127 ～ 128

            double minDiff = Integer.MAX_VALUE;
            int minScop = Integer.MAX_VALUE;

            for(int scop=-127; scop<=128; scop++){

                //+k 后的点求和
                double newSum = 0;

                for(int pixcel: originImgArr){

                    //像素点 小0 取 0  大于 255 取 255
                    newSum += Math.min(Math.max(pixcel+scop, 0), 255);
                }

                //求平均值

                double avg = newSum / (double)(originImgArr.length);

                //平均值和 128 比较，取出最小的值
                double diff = Math.abs(128 - avg);

                if(diff < minDiff){
                    minDiff = diff;

                    minScop = scop;
                }

            }

            System.out.println(minScop);


        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
